package com.miniapp.design.factory;

import com.miniapp.service.FileStorageService;
import com.miniapp.service.impl.MinioStorageServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 文件存储策略工厂类
 *
 * <p>管理不同的文件存储实现，根据配置动态获取对应的存储服务实例
 * <p>适配FileStorageService接口移除getStorageType方法后的实现
 *
 * @author yourName
 * @date 2025-09-07
 */
@Component
public class FileStorageStrategyFactory {

    /**
     * 当前激活的存储类型（从配置文件获取）
     */
    @Value("${file.storage.active:minio}")
    private String activeStorageType;

    /**
     * 存储策略映射：key-存储类型标识，value-对应的存储服务实例
     */
    private final Map<String, FileStorageService> storageStrategies = new HashMap<>(3);

    /**
     * 构造函数：初始化所有存储策略
     *
     * @param minioStorageService MinIO存储服务实例
     * @param ossStorageService 阿里云OSS存储服务实例
     * @param localStorageService 本地存储服务实例
     */
    @Autowired
    public FileStorageStrategyFactory(MinioStorageServiceImpl minioStorageService) {
        // 注册所有支持的存储策略
        storageStrategies.put("minio", minioStorageService);
    }

    /**
     * 获取当前激活的存储服务实例
     *
     * @return 当前激活的存储服务实例
     */
    public FileStorageService getActiveStorageService() {
        FileStorageService service = storageStrategies.get(activeStorageType);
        if (service == null) {
            throw new IllegalArgumentException("不支持的文件存储类型: " + activeStorageType +
                    "，支持的类型有: " + storageStrategies.keySet());
        }
        return service;
    }

    /**
     * 根据存储类型获取对应的存储服务实例
     *
     * @param storageType 存储类型标识（minio/oss/local）
     * @return 对应的存储服务实例
     */
    public FileStorageService getStorageService(String storageType) {
        if (storageType == null || storageType.trim().isEmpty()) {
            throw new IllegalArgumentException("存储类型不能为空");
        }

        FileStorageService service = storageStrategies.get(storageType.toLowerCase());
        if (service == null) {
            throw new IllegalArgumentException("不支持的文件存储类型: " + storageType +
                    "，支持的类型有: " + storageStrategies.keySet());
        }
        return service;
    }

    /**
     * 获取所有支持的存储类型
     *
     * @return 存储类型集合
     */
    public Map<String, FileStorageService> getAllStorageServices() {
        // 返回副本，防止外部修改
        return new HashMap<>(storageStrategies);
    }

    /**
     * 获取当前激活的存储类型
     *
     * @return 当前激活的存储类型标识
     */
    public String getActiveStorageType() {
        return activeStorageType;
    }
}
